package com.palfund.butterknife.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * Created by clvc on 2017/8/21.
 * 真正的速度是看不见的 !
 * Today is today , we will go !
 */
@Documented
@Inherited
@Target({ElementType.METHOD, ElementType.LOCAL_VARIABLE, ElementType.PACKAGE, ElementType
        .PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnotation {
    String value() default "";

    int count() default -1;

    char chars();
}
/**
 * String 成员类型,可用的成员类型有String、Class、枚举、注解、基本数据类型(byte、short、int、long、float、double、boolean、char)
 * value 成员变量名称
 *
 * @Target(ElementType.TYPE)、@Target({ElementType.FIELD,ElementType.METHOD})表示适用的元素类型,
 * 如果未设置则表示适用于所有元素
 * ElementType.ANNOTATION_TYPE:适用于注解类型
 * ElementType.TYPE:适用于类、接口、枚举、注解
 * ElementType.CONSTRUCTOR:适用于构造方法
 * ElementType.FIELD:适用于成员变量、枚举常量
 * ElementType.METHOD:适用于方法
 * ElementType.PARAMETER:适用于参数
 * ElementType.LOCAL_VARIABLE:适用于局部变量
 * ElementType.PACKAGE:适用于包
 *
 * @Retention(RetentionPolicy.CLASS)设置注解的有效范围,如果未设置,注解的有效范围为RetentionPolicy.CLASS的范围
 * RetentionPolicy.SOURCE:源码时保留,使用此类的注解多为标记注解,比如@Override、@Deprecated、@SuppressWarnings等
 * RetentionPolicy.CLASS:编译时保留,如ButterKnife中使用的@BindView,@OnClick等就是声明为CLASS的
 * RetentionPolicy.RUNTIME:运行时保留,程序在运行过程中,使用这些注解比如我们常用的@Test。
 *
 * @Documented:将注解包含在Javadoc中
 * @Inherited:允许子类继承父类中的注解
 *
 * 如果在定义注解时,将注解的有效范围设置为@Retention(RetentionPolicy.RUNTIME),那么在运行程序时通过反射就可以获得到相关的注解信息
 * Constructor、Method、Field均可调用以下3个关于注解的方法:
 * boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)是否添加了指定类型的注解,如果是则返回true,否则返回false
 * <T extends Annotation> T getAnnotation(Class<T> annotationClass)获得指定类型的注解,如果存在则返回相应的对象,否则返回null
 * Annotation[] getAnnotations()获得所有的注解,该方法返回一个注解的数组
 *
 * Constructor、Method中定义了Annotation[][] getParameterAnnotations()获得所有参数添加的注解,以注解类型的二维数组返回,
 * 在数组中的顺序与声明顺序相同,如果没有注解则返回一个长度为0的数组,如果存在未添加注解的参数该方法将用一个长度为0的嵌套数组占位
 * 注解对象通过 .变量名 获取变量值
 *
 *
 */
